home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / etc / gdm / failsafeXServer < prev    next >
Text File  |  2008-09-19  |  5KB  |  148 lines

  1. #!/bin/bash
  2.  
  3. # $Id:$
  4. #
  5. # This provides a stripped down 'failsafe' mode for situations
  6. # where X is failing to start up.
  7.  
  8. # Author: Bryce W. Harrington <bryce@canonical.com>
  9.  
  10. # Copyright 2007 Canonical, Ltd
  11. #
  12. # This is free software; you may redistribute it and/or modify
  13. # it under the terms of the GNU General Public License as
  14. # published by the Free Software Foundation; either version 2,
  15. # or (at your option) any later version.
  16. #
  17. # This is distributed in the hope that it will be useful, but
  18. # WITHOUT ANY WARRANTY; without even the implied warranty of
  19. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. # GNU General Public License for more details.
  21. #
  22. # You should have received a copy of the GNU General Public License with
  23. # the Debian operating system, in /usr/share/common-licenses/GPL;  if
  24. # not, write to the Free Software Foundation, Inc., 59 Temple Place,
  25. # Suite 330, Boston, MA 02111-1307 USA
  26.  
  27. xorg_conf_failsafe=${BPX_XORG_CONF_FAILSAFE:-"/etc/X11/xorg.conf.failsafe"}
  28. xorg_conf=${BPX_XORG_CONF:-"/etc/X11/xorg.conf"}
  29. run_dexconf=${BPX_RUN_DEXCONF:-"yes"}
  30. fallback_driver=${BPX_FALLBACK_DRIVER:-"vesa"}
  31. client=${BPX_CLIENT:-"/etc/gdm/failsafeXinit"}
  32. clientargs=${BPX_CLIENTARGS:-$xorg_conf_failsafe}
  33. blacklist=${BPX_BLACKLIST:-"/etc/gdm/failsafeBlacklist"}
  34. main_driver=${BPX_DRIVER:-"vesa"}
  35. checkduration=${BPX_CHECK_DURATION:-30}
  36. failsafe_log=${BPX_LOG:-"/var/log/gdm/failsafe.log"}
  37.  
  38. server=${BPX_SERVER:-/usr/bin/X}
  39. serverargs=${BPX_SERVERARGS:-"$*"}
  40. serverargs="${serverargs} -br -once -config $xorg_conf_failsafe -logfile /var/log/Xorg.failsafe.log"
  41.    # -br:      Black background
  42.    # -once:    Terminate server after one session
  43.    # -config:  Specify location of xorg.conf file to use
  44.    #           Note: Only root can specify absolute paths
  45.    # -logfile: Don't overwrite Xorg.0.log
  46.  
  47. warn() {
  48.     echo "Warning:  $1" 1>&2
  49. }
  50.  
  51. is_installed() {
  52.     prog=$1
  53.     need=$2
  54.     /usr/bin/which $prog > /dev/null 2>&1
  55.     err=$?
  56.     if [ ! $err = 0 ]; then
  57.     warn "Could not $need because $prog is not installed ($err)"
  58.     return $err
  59.     fi
  60.     return 0
  61. }
  62.  
  63. # Tests if the given pciids are in numerical order from least to greatest
  64. # (e.g., $a <= $b <= $c <= ...)
  65. pciids_in_order() {
  66.     lastid=0
  67.     for pciid in $* ; do
  68.         # Strip embedded : and convert hex to dec
  69.         id=$((0x${pciid/:/}))
  70.         if [ $id -lt $lastid ]; then
  71.             return 1
  72.         fi
  73.         lastid=$id
  74.     done
  75.     return 0
  76. }
  77.  
  78. get_driver() {
  79.     machine=$(uname -m)
  80.     if [ $machine = "ppc" ]; then
  81.         echo "fbdev"
  82.     elif [ $machine = "powerpc" ]; then
  83.         echo "fbdev"
  84.     elif [ $machine = "ppc64" ]; then
  85.         echo "fbdev"
  86.     else
  87.         echo $fallback_driver
  88.     fi
  89.     return 0
  90. }
  91.  
  92. # Check if we've already attempted a failsafe session without success
  93. if [ -e "$failsafe_log" ]; then
  94.     cur_time=$(date +"%s")
  95.     last_run=$(tail -n 1 $failsafe_log | cut -d' ' -f1)
  96.     time_diff=$(expr $cur_time - $last_run)
  97.     if [ $time_diff -lt $checkduration ]; then
  98.         warn "Failsafe mode was already attempted within $checkduration seconds."
  99.         warn "Falling back to gdm to report the issue."
  100.         exit 1
  101.     fi
  102. fi
  103.  
  104. # When failsafe mode is activated, check the blacklist for systems we
  105. # know do not support VESA 800x600/256
  106. #      Use EDID + PCI IDs as key to lookup (Can get PCI IDs from discover)
  107. #      If the display does not give EDID info, then use VGA 640x480/16 mode
  108. #      If a matching entry is found, then use VGA 640x480/16 mode
  109. driver=$(get_driver)
  110.  
  111. if [ "x${run_dexconf}" = "xyes" ]; then
  112.     # Generate an appropriate xorg.conf
  113.     /etc/gdm/failsafeDexconf $driver $xorg_conf_failsafe
  114.     if [ ! -s $xorg_conf_failsafe ]; then
  115.         warn "Could not generate $xorg_conf_failsafe for $driver driver"
  116.         exit 1
  117.     fi
  118. elif [ ! -s $xorg_conf_failsafe ]; then
  119.     warn "Requested to use $xorg_conf_failsafe for $driver driver, but it does not exist"
  120.     exit 1
  121. fi
  122.  
  123. md5xorg=$(md5sum $xorg_conf)
  124. date +"%s $md5xorg" >> $failsafe_log
  125. if [ $? -ne 0 ]; then
  126.     warn "Cannot write to $failsafe_log"
  127. fi
  128.  
  129. # TODO:  Start up the failsafe X session using their regular user account
  130.  
  131. if pidof /usr/sbin/gdm ; then
  132.     clientargs="${clientargs} with-gdm"
  133. fi
  134.  
  135. echo "xinit $client $clientargs -- $server $serverargs"
  136. xinit $client $clientargs -- $server $serverargs &
  137.  
  138. sleep 3
  139.  
  140. # Stop gdm if it's running, otherwise it will attempt to manage the display
  141. # out from under us
  142. if pidof /usr/sbin/gdm ; then
  143.     exec kill -STOP $PPID
  144. fi
  145.  
  146. # This seems to cause gdm to attempt to start a new x session
  147. #exec kill -USR1 `cat /var/run/gdm.pid`
  148.